package com.craftyworks.alejandro.api;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Google API 사용을 위한 인증 서비스
 * 
 * @author ddam40
 */
public class GoogleAuthorization {
    
    public final static String GOOGLE_API_AUTH_URL = "https://www.google.com/accounts/ClientLogin";
    
    public final static String DEFAULT_ACCOUNT_TYPE = "HOSTED_OR_GOOGLE";
    
    private final Logger logger = LoggerFactory.getLogger(getClass());
    
    /**
     * Google 개발자 E-Mail 주소
     */
    private String email;
    
    /**
     * Google 개발자 패스워드
     */
    private String password;
    
    /**
     * Google API Service 명
     */
    private String service;
    
    /**
     * 로깅 용도로 사용될 Application 명
     * <p>companyName-applicationName-versionID
     */
    private String source;
    
    private String accountType = DEFAULT_ACCOUNT_TYPE;
    
    private HttpClientTemplate httpClient;
    
    /**
     * Google API 서비스 사용을 위한 인증 토큰 값
     */
    private String authorizationToken;
    
    public void setEmail(String email) {
        this.email = email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setService(String service) {
        this.service = service;
    }

    public void setSource(String source) {
        this.source = source;
    }
    
    public void setAccountType(String accoutType) {
        this.accountType = accountType;
    }

    public void setHttpClient(HttpClientTemplate httpClient) {
        this.httpClient = httpClient;
    }
    /**
     * Google API 사용을 위한 인증 토큰을 리턴한다.
     * <p>발급되지 않은 경우 발급을 요청한다.
     * @return Google API 사용을 위한 인증 토큰
     */
    public String getAuthorizationToken() {
        if(authorizationToken == null) {
            authorizationToken = issueAuthorizationToken();
        }
        return authorizationToken;
    }

    /**
     * Google API 사용을 위한 인증 토큰 발행을 Google API 서버에 요청한다.
     * @return Google API 서버로부터 발급 받은 인증 토큰
     */
    private String issueAuthorizationToken() {
        StringBuilder sb = new StringBuilder();
        sb.append("accountType=").append(accountType);
        sb.append("&Email=").append(email);
        sb.append("&Passwd=").append(password);
        sb.append("&service=").append(service);
        sb.append("&source=").append(source);
        
        try {
            HttpResponse response = httpClient.sendHttpRequest(GOOGLE_API_AUTH_URL, sb.toString());
            String[] contents = EntityUtils.toString(response.getEntity()).split("\\n");
            for(String line : contents) {
                if(line.startsWith("Auth=")) {
                    return line.substring("Auth=".length());
                }
            }        
        } catch (IOException e) {
            logger.error("failed to achieve authorization token", e);
        }
        return null;
    }
}
